#include "stdafx.h"
#include <string>
#include <boost/lexical_cast.hpp>
#include "detail/bmock_raw_mem.hpp"
#include "detail/bmock_in_out_str_arg_val.hpp"

namespace bmock {
	in_out_str_arg_val::in_out_str_arg_val(const char *const n,char *const vp)
		:out_str_arg_val(n,vp)
	{}

	in_out_str_arg_val::~in_out_str_arg_val() {
	}

	std::string in_out_str_arg_val::get_in_value(const arg_checker &chk) const {
		if(null_supplied()) return NULL_STR;
		in_out_rm_pair rmp(val_ptr_,name_,chk);
		if(rmp.first.is_empty()) return IGNORE_STR;
		return rmp.first.get_str_value();
	}

	std::string in_out_str_arg_val::get_in_value() const {
		return std::string(val_ptr_);
	}

	std::string in_out_str_arg_val::get_out_value(const arg_checker &chk) const {
		if(null_supplied()) return NULL_STR;
		in_out_rm_pair rmp(val_ptr_,name_,chk);
		if(rmp.second.is_empty()) return IGNORE_STR;
		return rmp.second.get_str_value();
	}

	bool in_out_str_arg_val::validate(const arg_checker &chk,const std::string &v) const {
		if(chk.check_ptr(name_,null_expected(v),null_supplied())) return true;
		if(null_expected(v)&&null_supplied()) return false;
		if(ignore(v)) return false;
		return chk.check_arg(name_,v,__get_value(val_ptr_));
	}

	bool in_out_str_arg_val::validate_no_msg(const arg_checker &chk,const std::string &v) const {
		if(chk.check_ptr_no_msg(name_,null_expected(v),null_supplied())) return true;
		if(null_expected(v)&&null_supplied()) return false;
		if(ignore(v)) return false;
		return chk.check_arg_no_msg(name_,v,__get_value(val_ptr_));
	}

	void in_out_str_arg_val::print(std::ostream &os) const {
		in_out_arg_value_expectation exp(val_ptr_);
		exp.print(os);
	}
}